<?php

use Yaf\Registry;
use models\Business\Tbk\TbkCategory;
use models\Business\Tbk\TbkProduct;
use models\Business\Tbk\TbkOrder;
use models\Business\Member;
use models\Exception\Business\TbkproductException;
use models\Business\Tbk\TbkSdk\Tbk;
use models\Business\Tbk\TkUrl;


class TbkController extends ApiBaseController
{
    /**
     * @SWG\Get(
     *     path="/v3/tbkcategory/list",
     *     tags={"淘宝商品管理"},
     *     summary="获取淘宝商品分类列表数据接口",
     *     description="
     * page 必须参数 页码
     * page_size 必须参数 每页显示条数
     * sort 必须参数 排序方式 固定值:asc升序
     * order 必须参数 排序字段 固定值:id
     * stats 必须参数 是否显示在app或网站上 固定值:999",
     *     @SWG\Parameter(
     *          name="Authorization",
     *          description="Authorization 登录接口返回的jwt字段的值",
     *          in="header",
     *          required=false,
     *          type="string"
     *     ),
     *     @SWG\Parameter(
     *          name="secret",
     *          description="页码",
     *          in="query",
     *          required=true,
     *          type="string"
     *     ),
     *     @SWG\Response(
     *         response="200",
     *         description="请求成功",
     *         @SWG\Schema(type="object", ref="#/definitions/tbkcategoryListData")
     *     ),
     *     @SWG\Response(
     *         response="400",
     *         description="签名不存在或无效签名"
     *     ),
     *     @SWG\Response(
     *         response="401",
     *         description="jwt无效或过期，需要登录"
     *     ),
     *     @SWG\Response(
     *         response="403",
     *         description="无权访问"
     *     ),
     *     @SWG\Response(
     *         response="404",
     *         description="找不到数据"
     *     )
     * )
     */
    public function listAction() {
        $parameters = Registry::get('parameters');

        $category_list = TbkCategory::getTbkCategoryList($parameters);

        return $this->_responseJson($category_list);
    }

    /**
     * @SWG\Get(
     *     path="/v3/tbkproduct/list",
     *     tags={"淘宝商品管理"},
     *     summary="获取淘宝商品列表数据接口",
     *     description="
     * page 必须参数 页码
     * page_size 必须参数 每页显示条数
     * sort 必须参数 排序方式 可选值:desc降序、asc生序
     * order 必须参数 排序字段 可选值: 综合(general_index)、综合(general_index)、综合(general_index)、
     * stats 必须参数 是否显示在app或网站上 固定值：1
     * category 必须参数 上级分类 从v3/alibabacategory/list接口返回的记录的id字段的值
     * recommend 非必须参数 是否推荐拼团 可选值: 0为否，1为是。获取推荐拼团时，该参数必须，传1",
     *     @SWG\Parameter(
     *          name="Authorization",
     *          description="Authorization 登录接口返回的jwt字段的值",
     *          in="header",
     *          required=false,
     *          type="string"
     *     ),
     *     @SWG\Parameter(
     *          name="secret",
     *          description="加密字符串",
     *          in="query",
     *          required=true,
     *          type="string"
     *     ),
     *     @SWG\Response(
     *         response="200",
     *         description="请求成功",
     *         @SWG\Schema(type="object", ref="#/definitions/tbkproductListData")
     *     ),
     *     @SWG\Response(
     *         response="400",
     *         description="签名不存在或无效签名"
     *     ),
     *     @SWG\Response(
     *         response="401",
     *         description="jwt无效或过期，需要登录"
     *     ),
     *     @SWG\Response(
     *         response="403",
     *         description="无权访问"
     *     ),
     *     @SWG\Response(
     *         response="404",
     *         description="找不到数据"
     *     )
     * )
     */
    public function productListAction() {
        $parameters = Registry::get('parameters');

        $product_list = TbkProduct::getTbkProductList($parameters);

        return $this->_responseJson($product_list);
    }

    /**
     * @SWG\Get(
     *     path="/v3/tbkproduct/{product_id}/info",
     *     tags={"淘宝商品管理"},
     *     summary="获取淘宝商品详情接口",
     *     description="
     * timestamp 必须参数 当前时间戳 14位",
     *     @SWG\Parameter(
     *          name="Authorization",
     *          description="Authorization 登录接口返回的jwt字段的值",
     *          in="header",
     *          required=false,
     *          type="string"
     *     ),
     *     @SWG\Parameter(
     *          name="product_id",
     *          description="/v3/tbkproduct/list接口返回的product_id字段的值",
     *          in="path",
     *          required=true,
     *          type="string"
     *     ),
     *     @SWG\Parameter(
     *          name="secret",
     *          description="加密字符串",
     *          in="query",
     *          required=true,
     *          type="string"
     *     ),
     *     @SWG\Response(
     *         response="200",
     *         description="请求成功",
     *         @SWG\Schema(type="object", ref="#/definitions/tbkproductSingleData")
     *     ),
     *     @SWG\Response(
     *         response="400",
     *         description="签名不存在或无效签名"
     *     ),
     *     @SWG\Response(
     *         response="401",
     *         description="jwt无效或过期，需要登录"
     *     ),
     *     @SWG\Response(
     *         response="403",
     *         description="无权访问"
     *     ),
     *     @SWG\Response(
     *         response="404",
     *         description="找不到数据"
     *     )
     * )
     */
    public function infoAction() {
        $parameters = Registry::get('parameters');

        $product = TbkProduct::getTbkProductByProductId($parameters['id']);

        // 足迹
        Member::footprint($product['data'][0], 'tbk');

        return $this->_responseJson($product);
    }

    /**
     * @SWG\Put(
     *     path="/v3/tbkproduct/{product_id}/coupon",
     *     tags={"淘宝商品管理"},
     *     summary="用户点击领券按钮",
     *     description="
     * timestamp 必须参数 当前时间戳 14位",
     *     @SWG\Parameter(
     *          name="Authorization",
     *          description="Authorization 登录接口返回的jwt字段的值",
     *          in="header",
     *          required=true,
     *          type="string"
     *     ),
     *     @SWG\Parameter(
     *          name="product_id",
     *          description="/v3/tbkproduct/list接口返回的product_id字段的值",
     *          in="path",
     *          required=true,
     *          type="string"
     *     ),
     *     @SWG\Parameter(
     *          name="secret",
     *          description="加密字符串",
     *          in="formData",
     *          required=true,
     *          type="string"
     *     ),
     *     @SWG\Response(
     *         response="200",
     *         description="请求成功",
     *         @SWG\Schema(type="object", ref="#/definitions/tbkproductSingleData")
     *     ),
     *     @SWG\Response(
     *         response="400",
     *         description="签名不存在或无效签名"
     *     ),
     *     @SWG\Response(
     *         response="401",
     *         description="jwt无效或过期，需要登录"
     *     ),
     *     @SWG\Response(
     *         response="403",
     *         description="无权访问"
     *     ),
     *     @SWG\Response(
     *         response="404",
     *         description="找不到数据"
     *     )
     * )
     */
    public function couponAction() {
        $parameters = Registry::get('parameters');

        TbkProduct::decrProductCoupon($parameters);

        return $this->_responseJson(new stdClass(), '000', '领券成功');
    }

    /**
     * @SWG\Post(
     *     path="/v3/tbkorder/rebate",
     *     tags={"淘宝订单管理"},
     *     summary="淘宝晒单",
     *     description="
     * sn 必须参数 淘宝订单编号 用户手动输入",
     *     @SWG\Parameter(
     *          name="Authorization",
     *          description="Authorization 登录接口返回的jwt字段的值",
     *          in="header",
     *          required=true,
     *          type="string"
     *     ),
     *     @SWG\Parameter(
     *          name="secret",
     *          description="加密字符串",
     *          in="formData",
     *          required=true,
     *          type="string"
     *     ),
     *     @SWG\Response(
     *         response="200",
     *         description="请求成功",
     *         @SWG\Schema(type="object", ref="#/definitions/tbkorderSingleData")
     *     ),
     *     @SWG\Response(
     *         response="400",
     *         description="签名不存在或无效签名"
     *     ),
     *     @SWG\Response(
     *         response="401",
     *         description="jwt无效或过期，需要登录"
     *     ),
     *     @SWG\Response(
     *         response="403",
     *         description="无权访问"
     *     ),
     *     @SWG\Response(
     *         response="404",
     *         description="找不到数据"
     *     )
     * )
     */
    public function rebateAction() {
        $parameters = Registry::get('parameters');

        // 从jwt中读取会员信息，获取淘宝授权
        $parameters['id'] = Registry::get('jwt_info')->id;

        $is_correct = Tbk::rebate($parameters);
        if ($is_correct === true) {
            $order_info = TbkOrder::rebate($parameters['sn'], Registry::get('jwt_info')->id);
        }
        return $this->_responseJson(['data' => $order_info]);
    }

    /**
     * @SWG\Get(
     *     path="/v3/tbkorder/list",
     *     tags={"淘宝订单管理"},
     *     summary="获取淘宝晒单列表",
     *     description="
     * page 必须参数 页码
     * page_size 必须参数 每页显示条数
     * sort 必须参数 排序方式 固定值:asc升序
     * order 必须参数 排序字段 固定值:order_sn
     * stats 必须参数 订单状态 可选值:0(全部)、1(已失效)、2(已付款)、3(已结算)、4(进行中)(取消该状态)
     * friend 非必须参数 是否查询好友淘宝晒单列表 当获取好友晒单列表时传1",
     *     @SWG\Parameter(
     *          name="Authorization",
     *          description="Authorization 登录接口返回的jwt字段的值",
     *          in="header",
     *          required=true,
     *          type="string"
     *     ),
     *     @SWG\Parameter(
     *          name="secret",
     *          description="页码",
     *          in="query",
     *          required=true,
     *          type="string"
     *     ),
     *     @SWG\Response(
     *         response="200",
     *         description="请求成功",
     *         @SWG\Schema(type="object", ref="#/definitions/tbkorderListData")
     *     ),
     *     @SWG\Response(
     *         response="400",
     *         description="签名不存在或无效签名"
     *     ),
     *     @SWG\Response(
     *         response="401",
     *         description="jwt无效或过期，需要登录"
     *     ),
     *     @SWG\Response(
     *         response="403",
     *         description="无权访问"
     *     ),
     *     @SWG\Response(
     *         response="404",
     *         description="找不到数据"
     *     )
     * )
     */
    public function orderListAction() {
        $parameters = Registry::get('parameters');
        $parameters['order'] = 'order_sn';

        $order_list = TbkOrder::getOrderList($parameters);

        return $this->_responseJson($order_list);
    }

    /**
     * @SWG\Get(
     *     path="/v3/tbkproduct/search",
     *     tags={"淘宝商品管理"},
     *     summary="淘宝商品搜索接口",
     *     description="
     * page 必须参数 页码
     * page_size 必须参数 每页显示条数
     * sort 必须参数 排序方式 可选值:desc降序、asc生序
     * order 必须参数 排序字段 可选值: 综合(general_index)
     * keyword 必须参数 搜索关键词 可为商品编号、商品链接或关键词",
     *     @SWG\Parameter(
     *          name="Authorization",
     *          description="Authorization 登录接口返回的jwt字段的值",
     *          in="header",
     *          required=false,
     *          type="string"
     *     ),
     *     @SWG\Parameter(
     *          name="secret",
     *          description="加密字符串",
     *          in="query",
     *          required=true,
     *          type="string"
     *     ),
     *     @SWG\Response(
     *         response="200",
     *         description="请求成功",
     *         @SWG\Schema(type="object", ref="#/definitions/tbkproductListData")
     *     ),
     *     @SWG\Response(
     *         response="400",
     *         description="签名不存在或无效签名"
     *     ),
     *     @SWG\Response(
     *         response="401",
     *         description="jwt无效或过期，需要登录"
     *     ),
     *     @SWG\Response(
     *         response="403",
     *         description="无权访问"
     *     ),
     *     @SWG\Response(
     *         response="404",
     *         description="找不到数据"
     *     )
     * )
     */
    public function searchAction() {
        $parameters = Registry::get('parameters');
        $search_title = false;

        // 处理参数
//        $parameters['keyword'] = '女装';
//        $parameters['keyword'] = '123312';
//        $parameters['keyword'] = 'https://market.m.taobao.com/app/tb-source-app/aiguangjiepc/item/index.html?spm=a21bo.2017.2001.6.5af911d9k85Qsl&itemId=200407289780';
        // keyword的值是一个url
        if (null !== $arr = parse_url($parameters['keyword'], 1)) {
            parse_str(substr($parameters['keyword'], strpos($parameters['keyword'], '?') + 1), $arr);
            if (! isset($arr['id']) || empty($arr['id']))
                throw new Exception('请输入一个有效的淘宝链接,或按照关键词、商品编号进行搜索', 400);
            $parameters['product_id'] = $arr['id'];
        }
        // keyword的值不是个url
        else {
            if (is_numeric($parameters['keyword']))
                $parameters['product_id'] = $parameters['keyword'];
            else {
                $num_iid = TkUrl::tpwdConvert($parameters['keyword']);
                if (empty($num_iid) && preg_match_all("/https:[\/]{2}[a-z]+[.]{1}[a-z\d\-]+[.]{1}[a-z\d]*[\/]*[A-Za-z\d]*[\/]*[A-Za-z\d]+[.]{1}[a-z\d]*[\/]*[A-Za-z\d]*[\/]*[A-Za-z\d]+[?][a-zA-Z0-9]*+[=][a-zA-Z0-9]*/", $parameters['keyword'], $arr)) {
                    $url = $arr[0][0];
                    try {
                        list($header_size, $resp) = \youliPhpLib\Common\RequestHelper::curlRequest($url);
                        if (preg_match_all("/url = '(.*)'/", $resp, $arr)) {
                            $target_url = $arr[1][0];
                            if (null !== $arr = parse_url($target_url, 1)) {
                                parse_str(substr($target_url, strpos($target_url, '?') + 1), $arr);
                                $parameters['product_id'] = $arr['id'];
                            }
                        }
                    } catch (Exception $e){

                    }
                } else if (is_numeric($num_iid)) {
                    $parameters['product_id'] = $num_iid;
                    unset($parameters['keyword']);
                } else {
                    $parameters['title'] = $parameters['keyword'];
                    $search_title = true;
                }
            }
        }

        try {
            if (isset($parameters['url']) || !empty($parameters['url'])) {
                exit(json_encode($parameters['url']));
            }
            // 搜索数据库，看是否有符合条件的结果
            $product_list = TbkProduct::getTbkProductList($parameters);
        } catch (Exception $e) {

//            $parameters['product_id'] = '616375979610';
//            $search_title = false;
            if ($e->getCode() != TbkproductException::TBKPRODUCT_IS_NOT_EXISTS_NO)
                throw $e;
            else if ($search_title === true && empty($product_list)) {
                throw new TbkproductException(TbkproductException::TBKPRODUCT_IS_NOT_EXISTS, TbkproductException::TBKPRODUCT_IS_NOT_EXISTS_NO);
            }
            else {
                // 若没有数据，则调用好单库的接口
//                $product_list = TbkProduct::searchFromHDK($parameters);
                // 若没有数据，直接转高佣链接
                $product_info = TkUrl::privilege($parameters['product_id']);

                if (!empty($product_info)) {
                    try {
                        TbkProduct::collectTbkProduct([$product_info]);
                    } catch (Exception $e) {

                    }
                } else {
                    throw new TbkproductException(TbkproductException::TBKPRODUCT_IS_NOT_EXISTS, TbkproductException::TBKPRODUCT_IS_NOT_EXISTS_NO);
                }

                $product_list = TbkProduct::getTbkProductByProductId($parameters['product_id']);

            }
        }

        return $this->_responseJson($product_list);
    }
}
